spice_server_include += [include_directories('.')]

#
# generate spice-version.h
#
if meson.project_version().startswith('UNKNOWN')
  major = '0'
  minor = '0'
  micro = '1'
else
  additional_commits = false
  increment_micro = 0
  # remove the "-dirty" from version, increment micro later if found
  version_info = meson.project_version().split('-dirty')
  if version_info.length() > 1
    increment_micro = 1
  endif
  # remove the "-" from version, increment micro later if found
  version_info = version_info[0].split('-')
  if version_info.length() > 1
    additional_commits = true
    increment_micro = 1
  endif
  version_info = version_info[0].split('.')
  if ((not additional_commits and version_info.length() != 3)
    or (additional_commits and version_info.length() != 4))
    error('Invalid version @0@'.format(meson.project_version()))
  endif
  major = '@0@'.format(version_info[0].to_int())
  minor = '@0@'.format(version_info[1].to_int())
  micro = '@0@'.format(version_info[2].to_int() + increment_micro)
endif

cmd = run_command('printf', ['0x%02x%02x%02x', major, minor, micro], check : true)
version_data = configuration_data()
version_data.set('SPICE_SERVER_VERSION', cmd.stdout().strip())
spice_version_h = configure_file(input : 'spice-version.h.in',
                                 output : 'spice-version.h',
                                 configuration : version_data)

#
# libspice-server.so
#
spice_server_headers = [
  spice_version_h,
  'spice-audio.h',
  'spice-char.h',
  'spice-core.h',
  'spice-input.h',
  'spice-migration.h',
  'spice-qxl.h',
  'spice-server.h',
  'spice-replay.h',
  'spice.h',
]

install_headers(spice_server_headers, subdir : 'spice-server')

# generate enums
gnome = import('gnome')
spice_server_enums = gnome.mkenums('spice-server-enums',
                                   sources : 'spice-server.h',
                                   symbol_prefix : 'SPICE',
                                   c_template: 'spice-server-enums.c.tmpl',
                                   h_template: 'spice-server-enums.h.tmpl')

spice_server_sources = [
  spice_server_headers,
  spice_server_enums,
  'agent-msg-filter.c',
  'agent-msg-filter.h',
  'cache-item.h',
  'char-device.cpp',
  'char-device.h',
  'common-graphics-channel.cpp',
  'common-graphics-channel.h',
  'cursor-channel.cpp',
  'cursor-channel-client.cpp',
  'cursor-channel-client.h',
  'cursor-channel.h',
  'utils.hpp',
  'safe-list.hpp',
  'dcc.cpp',
  'dcc.h',
  'dcc-private.h',
  'dcc-send.cpp',
  'dispatcher.cpp',
  'dispatcher.h',
  'display-channel.cpp',
  'display-channel.h',
  'display-channel-private.h',
  'display-limits.h',
  'event-loop.c',
  'glib-compat.h',
  'glz-encoder.c',
  'glz-encoder-dict.c',
  'glz-encoder-dict.h',
  'glz-encoder.h',
  'glz-encoder-priv.h',
  'image-cache.cpp',
  'image-cache.h',
  'image-encoders.cpp',
  'image-encoders.h',
  'inputs-channel.cpp',
  'inputs-channel-client.cpp',
  'inputs-channel-client.h',
  'inputs-channel.h',
  'jpeg-encoder.c',
  'jpeg-encoder.h',
  'main-channel.cpp',
  'main-channel-client.cpp',
  'main-channel-client.h',
  'main-channel.h',
  'main-dispatcher.cpp',
  'main-dispatcher.h',
  'memslot.c',
  'memslot.h',
  'migration-protocol.h',
  'mjpeg-encoder.c',
  'net-utils.c',
  'net-utils.h',
  'pixmap-cache.cpp',
  'pixmap-cache.h',
  'red-channel.cpp',
  'red-channel-capabilities.c',
  'red-channel-capabilities.h',
  'red-channel-client.cpp',
  'red-channel-client.h',
  'red-channel.h',
  'red-client.cpp',
  'red-client.h',
  'red-common.h',
  'red-parse-qxl.cpp',
  'red-parse-qxl.h',
  'red-pipe-item.cpp',
  'red-pipe-item.h',
  'red-qxl.cpp',
  'red-qxl.h',
  'red-record-qxl.cpp',
  'red-record-qxl.h',
  'red-replay-qxl.cpp',
  'reds.cpp',
  'reds.h',
  'reds-private.h',
  'red-stream.cpp',
  'red-stream.h',
  'red-worker.cpp',
  'red-worker.h',
  'sound.cpp',
  'sound.h',
  'spice-bitmap-utils.c',
  'spice-bitmap-utils.h',
  'spicevmc.cpp',
  'spice-wrapped.h',
  'stat-file.c',
  'stat-file.h',
  'stat.h',
  'stream-channel.cpp',
  'stream-channel.h',
  'sys-socket.c',
  'sys-socket.h',
  'red-stream-device.cpp',
  'red-stream-device.h',
  'sw-canvas.c',
  'tree.cpp',
  'tree.h',
  'utils.c',
  'utils.h',
  'video-encoder.h',
  'video-stream.cpp',
  'video-stream.h',
  'websocket.c',
  'websocket.h',
  'zlib-encoder.c',
  'zlib-encoder.h',
]

if spice_server_has_lz4 == true
  spice_server_sources += ['lz4-encoder.c',
                           'lz4-encoder.h']
endif

if spice_server_has_smartcard == true
  spice_server_sources += ['smartcard.cpp',
                           'smartcard.h',
                           'smartcard-channel-client.cpp',
                           'smartcard-channel-client.h']
endif

if spice_server_has_gstreamer == true
  spice_server_sources += ['gstreamer-encoder.c']
endif

#
# custom link_args
#
spice_server_syms = files('spice-server.syms')
spice_server_syms_path = join_paths(meson.current_source_dir(), 'spice-server.syms')
spice_server_link_args = ['-Wl,--no-copy-dt-needed-entries',
                          '-Wl,-z,relro',
                          '-Wl,-z,now',
                          '-Wl,--version-script=@0@'.format(spice_server_syms_path)]

spice_server_libs = library('spice-server', spice_server_sources,
                            version : spice_server_so_version,
                            install : true,
                            include_directories : spice_server_include,
                            link_args : compiler.get_supported_link_arguments(spice_server_link_args),
                            link_depends : spice_server_syms,
                            dependencies : spice_server_deps,
                            gnu_symbol_visibility : 'hidden')

if get_option('tests')
  if get_option('default_library') == 'both'
    spice_server_shared_lib = spice_server_libs.get_shared_lib()
    spice_server_static_lib = spice_server_libs.get_static_lib()
  elif get_option('default_library') == 'shared'
    spice_server_shared_lib = spice_server_libs
    # create static library extracting objects from shared one, avoid to
    # install static library using both_libraries
    spice_server_static_lib = static_library('spice-server-static',
                                             objects: spice_server_libs.extract_all_objects(),
                                             dependencies : spice_server_deps)
  else
    # here we use the static library to link to utilities (currently spice-server-replay)
    spice_server_shared_lib = spice_server_libs
    spice_server_static_lib = spice_server_libs
  endif
  subdir('tests')
endif

pc = import('pkgconfig')
pc.generate(spice_server_libs,
            description : 'SPICE server library',
            subdirs : 'spice-server',
            requires : 'spice-protocol')
